ホームに戻る
出典 :
Button.IsDefault プロパティ (System.Windows.Controls) | Microsoft Learn Button.IsCancel プロパティ (System.Windows.Controls) | Microsoft Learn Button.IsDefaulted プロパティ (System.Windows.Controls) | Microsoft Learn
関連 :
Show・ShowDialog
目次 :

Button.IsDefault / Button.IsCancel プロパティ

Button のプロパティで、その Button が存在する Window における初期フォーカスとEscキー押下時の動作を規定する。
Windows Forms における DefaultButton / CancelButton と同等の機能であるが、Form (Window) ではなく Button に対して設定する点で異なる。

IsDefault

IsDefault == true に設定された Button は、Window が開いた際に初期フォーカスを得る。
即ち、他の Button にフォーカスを移動していなければ、Enter キー押下で Click イベントが発生する。

IsCancel

IsCancel == true に設定された Button は Esc キー押下でクリックイベントが発生する。
ウィンドウを閉じるためのボタンに割り当てることが前提となっており、
クリックイベントが発生すると、ハンドラ内に Close() が記述されていない場合でもハンドラ終了時にウィンドウが閉じる。

補足

ある Button に IsDefault == true が設定されている場合、別のコントロールにフォーカスが在る状態で Enter キーを押下すると、
  1. 当該コントロールの PreviewKeyDown(A)
  2. IsDefault == true が設定された Button の Click(B)
の順にイベントが発生する。

ここで、当該コントロールが TextBox で、Text プロパティにデータバインディングを行っていると、
TextBox がフォーカスを失うまで、Text の値はソースに書き戻されない。
このため、TextBox 上で Enter キーを押下し、上記(B)のハンドラでバインドソースを参照しようとしても
(新たに入力した文字がある場合) Text の値が正しく取得できない。
(TextBox にフォーカスが残ったまま Button.Click が実行される。)
画像
この場合は、上記(A)のハンドラ内で Text の値を明示的にバインドソースへ書き戻すなどの対応が必要である。

Button.IsDefaulted プロパティ

そのボタンが、Enter キー押下時にアクティブ化されるボタンであるかを示す。値の取得のみが可能。
IsDefaulted が true となる条件は以下のとおり。 例えば Window が IsDefault == true に設定された Button と、TextBox を有しているとする。
ここで TextBox にフォーカスが在る場合、Button の IsDefaulted が true となり、Enter キー押下時のイベントを処理することができる。
フォーカスが Button に移った場合、IsDefaulted は false となる。これは OnKeyDown により Enter キー押下を受け付けられるため、IsDefaulted を true とする必要が無いためである。